#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>

namespace bucai
{
    class JsonUtil
    {
    public:
        static bool Serialize(const Json::Value &root, std::string *str)
        {
            Json::StreamWriterBuilder swb;
            std::unique_ptr<Json::StreamWriter> ptr(swb.newStreamWriter());
            std::stringstream ss;
            ptr->write(root, &ss);
            *str = ss.str();
            return true;
        }
        static bool UnSerialize(const std::string &str, Json::Value *root)
        {
            Json::CharReaderBuilder crb;
            std::unique_ptr<Json::CharReader> ptr(crb.newCharReader());
            std::string serr;
            ptr->parse(str.c_str(), str.c_str() + str.size(), &(*root), &serr);

            if (serr.size() != 0)
            {
                std::cout << "UnSerialize err :> " << serr << std::endl;
                return false;
            }
            return true;
        }
    };
}

// int main()
// {
//     Json::Value root;
//     root["姓名"] = "张三";
//     root["年龄"] = 18;
//     root["成绩"].append(22);
//     root["成绩"].append(50);
//     root["成绩"].append(100);

//     std::string str1;
//     JsonUtil json;
//     json.Serialize(root, &str1);

//     std::cout << str1 << std::endl << std::endl;

//     Json::Value tt;
//     json.UnSerialize(str1, &tt);
//     std::cout<<tt["姓名"].asString() << std::endl;
//     std::cout<<tt["年龄"].asInt() << std::endl;
//     for(int i = 0; i < tt["成绩"].size(); i++){
//         std::cout << tt["成绩"][i].asInt();
//         std::cout << std::endl;
//     }
//     printf("\n");
// }